#include<event2/event.h>
#include<signal.h>
#include<iostream>
#include <string.h>
#include <event2/listener.h>
#include <event2/bufferevent.h>
using namespace std;
void read_cb(bufferevent *bev,void *arg)
{
    char data[1024]={0};
    //读取输入缓冲的数据
    int len=bufferevent_read(bev,data,sizeof(data)-1);
    cout<<data<<endl;
    if(len<=0)return;
    // if(strstr(data,"quit")!=NULL)
    // {
    //     cout<<"quit"<<endl;
    //     //退出并关闭soket
    //     bufferevent_free(bev);
    // }
    //发送数据 写入到输出缓冲
    //bufferevent_write(bev,"okkkkk",6);
}
void write_cb(bufferevent *bev,void *arg)
{
    cout<<"[W]"<<flush;
    FILE *fp=(FILE*)arg;
    char data[1024]={0};
    int len=fread(data,1,sizeof(data)-1,fp);
    if(len<=0)
    {
        //读到结尾或文件出错
        fclose(fp);
        //立刻清理，可能会造成缓冲数据未发送
        //bufferevent_free(bev);
        bufferevent_disable(bev,EV_WRITE);
        return;
    }
    //写入buffer
    bufferevent_write(bev,data,len);
}
//错误 ，超时，连接断开会进入
void event_cb(bufferevent *bev, short what, void *ctx)
{
    cout<<"[E]"<<flush;
    if(what & BEV_EVENT_TIMEOUT)
    {
        cout<<"BEV_EVENT_TIMEOUT"<<endl;

        return;
    }
    //服务端的关闭事件
    if(what&BEV_EVENT_EOF)
    {
        cout<<"BEV_EVENT_EOF"<<endl;
        bufferevent_free(bev);
    }
    if(what&BEV_EVENT_CONNECTED)
    {
        cout<<"BEV_EVENT_CONNECTED"<<endl;
        //激活write
        bufferevent_trigger(bev,EV_WRITE,0);
    }

}
#if 0
void listen_cb(evconnlistener * ev, evutil_socket_t s, struct sockaddr * a, int socklen, void *arg)
{
    cout<<"listen_cb"<<endl;
    event_base *base=(event_base*)arg;
    //创建buffevent上下文 BEV_OPT_CLOSE_ON_FREE：清理bufferevent时关闭socket
    bufferevent* bev = bufferevent_socket_new(base,s,BEV_OPT_CLOSE_ON_FREE);
    //添加读写权限
    bufferevent_enable(bev,EV_READ|EV_WRITE);
    //设置回调函数
    //设置水位
    //设置读取水位
    // bufferevent_setwatermark(bev,EV_READ,
    //     10,//低水位
    //     0//高水位，0就是不限制 默认为0
    // );
    //高水位
    // bufferevent_setwatermark(bev,EV_READ,
    //     0,//低水位
    //     10//高水位，0就是不限制 默认为0
    // );
    //设置写入水位
    // bufferevent_setwatermark(bev,EV_WRITE,
    //     0,//低水位
    //     5//高水位,写入高水位无效
    // );
    //超时时间的设置
    timeval t1={3,0};
    bufferevent_set_timeouts(bev,&t1,NULL);
    bufferevent_setcb(bev,read_cb,write_cb,event_cb,base);
}
#endif
int main(int argc,char **argv)
{
    if(signal(SIGPIPE,SIG_IGN)==SIG_ERR)
    {
        return 1;
    }
    event_base *eb=event_base_new();
    //创建网络服务器
    // sockaddr_in sin;
    // memset(&sin,0,sizeof(sin));
    // sin.sin_family=AF_INET;
    // sin.sin_port=htons(6666);
    // evconnlistener *ec = evconnlistener_new_bind(eb,
    //     listen_cb,
    //     eb,
    //     LEV_OPT_REUSEABLE|LEV_OPT_CLOSE_ON_FREE,
    //     10,
    //     (sockaddr *)&sin,
    //     sizeof(sin)
    // );
    
    //调用客户端代码
    //-1 内部创建sokect
    bufferevent *bev= bufferevent_socket_new(eb,-1,BEV_OPT_CLOSE_ON_FREE);
    sockaddr_in sin;
    memset(&sin,0,sizeof(sin));
    sin.sin_family=AF_INET;
    sin.sin_port=htons(6666);
    evutil_inet_pton(AF_INET,"127.0.0.1",&sin.sin_addr.s_addr);
    FILE *fp=fopen("/home/ubuntu/StudyLibevent/testfile","rb");
    //设置回调函数
    bufferevent_setcb(bev,read_cb,write_cb,event_cb,fp);
    //设置权限
    bufferevent_enable(bev,EV_READ|EV_WRITE);
    //连接
    int re=bufferevent_socket_connect(bev,(sockaddr*)&sin,sizeof(sin));
    if(re==0)
    {
        cout<<"connect"<<endl;
    }
    event_base_dispatch(eb);

    //evconnlistener_free(ec);
    event_base_free(eb);
    
    return 0;
}